home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / program / funnel.zoo / sources / dump.c < prev    next >
C/C++ Source or Header  |  1993-04-11  |  26KB  |  817 lines

  1. /*##############################################################################
  2.  
  3. FUNNNELWEB COPYRIGHT
  4. ====================
  5. FunnelWeb is a literate-programming macro preprocessor.
  6.  
  7. Copyright (C) 1992 Ross N. Williams.
  8.  
  9.    Ross N. Williams
  10.    ross@spam.adelaide.edu.au
  11.    16 Lerwick Avenue, Hazelwood Park 5066, Australia.
  12.  
  13. This program is free software; you can redistribute it and/or modify
  14. it under the terms of Version 2 of the GNU General Public License as
  15. published by the Free Software Foundation.
  16.  
  17. This program is distributed WITHOUT ANY WARRANTY; without even the implied
  18. warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  19. See Version 2 of the GNU General Public License for more details.
  20.  
  21. You should have received a copy of Version 2 of the GNU General Public
  22. License along with this program. If not, you can FTP the license from
  23. prep.ai.mit.edu/pub/gnu/COPYING-2 or write to the Free Software
  24. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  25.  
  26. Section 2a of the license requires that all changes to this file be
  27. recorded prominently in this file. Please record all changes here.
  28.  
  29. Programmers:
  30.    RNW  Ross N. Williams  ross@spam.adelaide.edu.au
  31.  
  32. Changes:
  33.    07-May-1992  RNW  Program prepared for release under GNU GPL V2.
  34.  
  35. ##############################################################################*/
  36.  
  37.  
  38. /******************************************************************************/
  39. /*                                    DUMP.C                                  */
  40. /******************************************************************************/
  41.  
  42. #include <ctype.h>
  43. #include "style.h"
  44.  
  45. #include "as.h"
  46. #include "clock.h"
  47. #include "data.h"
  48. #include "dump.h"
  49. #include "misc.h"
  50.  
  51. /******************************************************************************/
  52.  
  53. #define DUMP_WIDTH (80)
  54.  
  55. /******************************************************************************/
  56.  
  57. /* The following advance declarations are required because of recursion. */
  58. LOCAL void dm_ex P_((p_wf_t,p_ells_t));
  59.  
  60. /******************************************************************************/
  61.  
  62. LOCAL void centerln P_((p_wf_t,uword,int,char *));
  63. LOCAL void centerln(p_wf,width,ch,s)
  64. /* Writes string s in a line surrounded by character ch to specified width.   */
  65. /* Example: centerln(*,20,'-',"sloth") would write: "------ sloth -------"    */
  66. p_wf_t p_wf;
  67. uword  width;
  68. int ch;
  69. char   *s;
  70. {
  71.  uword sidebar,i;
  72.  char  linet2[100];
  73.  /* Warning: linet2 can't be too big, or it will blow the Mac's limited       */
  74.  /* stack space. Perhaps it should be put in the heap with a static pointer.  */
  75.  
  76.  as_cold(width>=5,"centerln: Width is too small.");
  77.  as_cold(width<=80,"centerln: Width is too large.");
  78.  as_cold(strlen(s) <= width-4,"centerln: Width is too narrow for string.");
  79.  
  80.  /* Construct a sidebar string. */
  81.  sidebar=(width-strlen(s)-2)/2;
  82.  for (i=0;i<sidebar;i++) linet2[i]=ch;
  83.  linet2[sidebar]=EOS;
  84.  
  85.  /* Now construct the result string. */
  86.  strcpy(linet1,linet2);
  87.  strcat(linet1," ");
  88.  strcat(linet1,s);
  89.  strcat(linet1," ");
  90.  strcat(linet1,linet2);
  91.  
  92.  /* If the sidebar division removed a character, and the line is long enough  */
  93.  /* for the user not to notice the imbalance, tack a character on the end.    */
  94.  if (width>40 && strlen(linet1)==width-1)
  95.    {
  96.     uword len=strlen(linet1);
  97.     linet1[len]=ch;
  98.     linet1[len+1]=EOS;
  99.    }
  100.  
  101.  /* Write the result string to the specified stream. */
  102.  wf_wl(p_wf,linet1);
  103. }
  104.  
  105. /******************************************************************************/
  106.  
  107. LOCAL char * fontname P_((ubyte));
  108. LOCAL char * fontname(font)
  109. /* Given a font number, returns a pointer to a static string containing the   */
  110. /* name of the font.                                                          */
  111. ubyte font;
  112. {
  113.  switch (font)
  114.    {
  115.     case FT_NORM: return "Normal";
  116.     case FT_TITL: return "Title";
  117.     case FT_STIT: return "Small Title";
  118.     default     : as_bomb("fontname: Font switch defaulted.");
  119.    }
  120.  /* Keep GCC warnings happy. */
  121.  as_bomb("fontname: Dropped out of switch.");
  122.  return "Failure";
  123. }
  124.  
  125. /******************************************************************************/
  126.  
  127. LOCAL char * alignname P_((ubyte));
  128. LOCAL char * alignname(align)
  129. /* Given an alignment number, returns a pointer to a static string containing */
  130. /* the name of the alignment.                                                 */
  131. ubyte align;
  132. {
  133.  switch (align)
  134.    {
  135.     case LR_LEFT: return "Left";
  136.     case LR_RIGH: return "Right";
  137.     case LR_CENT: return "Centre";
  138.     default     : as_bomb("alignname: Alignment switch defaulted.");
  139.    }
  140.  /* Keep GCC warnings happy. */
  141.  as_bomb("alignnamename: Dropped out of switch.");
  142.  return "Failure";
  143. }
  144.  
  145. /******************************************************************************/
  146.  
  147. EXPORT void dm_mem(p_wf,p_mem,length)
  148. p_wf_t  p_wf;
  149. char   *p_mem;
  150. ulong   length;
  151. {
  152.  ubyte_ *p_base = (ubyte_ *) p_mem;
  153.  long   len     = length;
  154.  
  155.  wf_wl(p_wf,"");
  156.  wf_wl(p_wf,"MEMORY DUMP OF MAPPED FILE");
  157.  wf_wl(p_wf,"==========================");
  158.  wf_wl(p_wf,"");
  159.  wf_wr(p_wf,"+-------------------------------------------------+------------------+\n");
  160.  wf_wr(p_wf,"| 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F | 0123456789ABCDEF |\n");
  161.  wf_wr(p_wf,"+-------------------------------------------------+------------------+\n");
  162.  
  163.  while (len>0)
  164.    {/* Write a single line of 16 bytes per iteration. */
  165.     uword j;
  166.     wf_wr(p_wf,"| ");
  167.     for (j=0;j<16;j++)
  168.        if (j>=len)
  169.           wf_wr(p_wf,"   ");
  170.        else
  171.          {
  172.           char s[10];
  173.           sprintf(s,"%02X ",(unsigned int) p_base[j]);
  174.           wf_wr(p_wf,s);
  175.          }
  176.     wf_wr(p_wf,"| ");
  177.     for (j=0;j<16;j++)
  178.        if (j>=len)
  179.           wf_chr(p_wf,' ');
  180.        else
  181.         {
  182.          char ch=p_base[j];
  183.          /* DON'T use library function "isprint" - it is too loose. */
  184.          /* e.g. The vax "isprint" accepts top bit characters. */
  185.          if (!isascprn(ch)) ch='.';
  186.          wf_chr(p_wf,ch);
  187.         }
  188.     wf_wr(p_wf," |\n");
  189.     p_base+=16;
  190.     len-=16;
  191.    } /* End while */
  192.  
  193.  wf_wr(p_wf,"+-------------------------------------------------+------------------+\n");
  194.  wf_wl(p_wf,"");
  195. }
  196.  
  197. /******************************************************************************/
  198.  
  199. LOCAL void dm_byte P_((p_wf_t,ubyte));
  200. LOCAL void dm_byte(p_wf,b)
  201. /* Dumps a text representation of the given byte to the specified stream.     */
  202. p_wf_t p_wf;
  203. ubyte  b;
  204. {
  205.  char t[10];
  206.  /* DON'T use library function "isprint" - it is too loose. */
  207.  /* e.g. The vax "isprint" accepts top bit characters. */
  208.  if (isascprn(b))
  209.     sprintf(t,"%c",(char) b);
  210.  else
  211.     sprintf(t,"<%03u>",(unsigned) b);
  212.  wf_wr(p_wf,t);
  213. }
  214.  
  215. /******************************************************************************/
  216.  
  217. EXPORT void dm_lnls(p_wf)
  218. p_wf_t p_wf;
  219. {
  220.  wf_wl(p_wf,"");
  221.  centerln(p_wf,DUMP_WIDTH,'=',"Start of LINE LIST DUMP");
  222.  wf_wl(p_wf,"");
  223.            /*12345678901234567890123456789012345678901234567890123456789012345678901234567890*/
  224.  wf_wl(p_wf,"Globl Local| Text");
  225.  wf_wl(p_wf,"-----------+--------------------------------------------------------------------");
  226.  ls_fir(line_list);
  227.  while (TRUE)
  228.    {
  229.     ln_t *p_line;
  230.     char *p;
  231.     ls_nxt(line_list,PPV &p_line);
  232.     if (p_line==NULL) break;
  233.     sprintf(linet1,"%05lu %05lu| ",
  234.             (ulong) p_line->ln_global,
  235.             (ulong) p_line->ln_local);
  236.     wf_wr(p_wf,linet1);
  237.     for (p=p_line->ln_body.sc_first; p<=p_line->ln_body.sc_last; p++)
  238.        dm_byte(p_wf,*((ubyte_ *)p));
  239.     wf_wl(p_wf,"");
  240.    }
  241.  wf_wl(p_wf,"-----------+--------------------------------------------------------------------");
  242.  wf_wl(p_wf,"Globl Local| Text");
  243.  wf_wl(p_wf,"");
  244.  centerln(p_wf,DUMP_WIDTH,'=',"End of LINE LIST DUMP");
  245.  wf_wl(p_wf,"");
  246. }
  247.  
  248. /******************************************************************************/
  249.  
  250. LOCAL void dm_sc P_((p_wf_t,p_sc_t));
  251. LOCAL void dm_sc(p_wf,p_sc)
  252. /* Dumps the specified scrap to the specified stream. */
  253. p_wf_t p_wf;
  254. p_sc_t p_sc;